package dao;

import hibernate.HibernateUtil;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import entity.Proveedor.Entity_PrecioCarrier;
import entity.Proveedor.Entity_Seguro;
import entity.Proveedor.Entity_FacturaProveedor;
import entity.Proveedor.Entity_Proveedor;
import entity.Proveedor.Entity_ServicioSeguridad;

public class ProveedorDAO {
	private static ProveedorDAO instancia = null;
	private static SessionFactory sf = null;

	
	public static ProveedorDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new ProveedorDAO();
		} 
		return instancia;
	}
		
	
	public void altaProveedor(Entity_Proveedor proveedor){
        try {
        	Session session=sf.openSession();
            session.beginTransaction();
            session.save(proveedor); 
            session.getTransaction().commit();
            session.close();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error ProveedorDAO. Alta Proveedor");
        }
	}
	public void modificarProveedor(Entity_Proveedor proveedor) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(proveedor); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ProveedorDAO. Modificar Proveedor");
	        }
	}
	public void bajaProveedor(Entity_Proveedor proveedor) {
		try {
			 Session session=sf.getCurrentSession();
            session.beginTransaction();
            session.delete(proveedor);
            session.flush();
            session.getTransaction().commit();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error ProveedorDAO. Eliminar Proveedor");
       }
	}

	public Entity_Proveedor getProveedor(Integer id){

		 try {
			  Session session=sf.openSession();
              session.beginTransaction();
              Entity_Proveedor p = (Entity_Proveedor) session.get(Entity_Proveedor.class, id);
              session.getTransaction().commit();
              return p;
		  } catch (Exception e) {
              System.out.println(e);
              System.out.println("Error ProveedorDAO. Get Proveedor");
		  }
      
		  return null;
	}
	
	
	 public Entity_Proveedor buscarProveedor(String cuit){
		 Entity_Proveedor p = null;
         
         try {
        	 	Session session=sf.openSession();
                 session.beginTransaction();
                 p = (Entity_Proveedor) session.createQuery("from Entity_Proveedor p where p.cuit= :cuit").setParameter("cuit", cuit).uniqueResult();
                 session.flush();
                 session.getTransaction().commit();
         } catch (Exception e) {
                 System.out.println(e);
                 System.out.println("Error ProveedorDAO. Buscar Proveedor");
         }
         
         return p;
	}
	 
	 public void AltaFacturaProveedor(Entity_FacturaProveedor factura){
	        try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(factura); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ProveedorDAO. Alta Factura Proveedor");
	        }
		}
	 
		public void modificarFacturaProveedor(Entity_FacturaProveedor factura) {
			 try {
		        	Session session=sf.openSession();
		            session.beginTransaction();
		            session.update(factura); 
		            session.getTransaction().commit();
		            session.close();
		        } catch (Exception e){
		            System.out.println(e);
		            System.out.println("Error ProveedorDAO. Modificar Factura Proveedor");
		        }
		}
		public void bajaFacturaProveedor(Entity_FacturaProveedor factura) {
			try {
				 Session session=sf.getCurrentSession();
	            session.beginTransaction();
	            session.delete(factura);
	            session.flush();
	            session.getTransaction().commit();
	       } catch (Exception e){
	           System.out.println(e);
	           System.out.println("Error ProveedorDAO. Eliminar Factura Proveedor");
	       }
		}

		public Entity_FacturaProveedor getFacturaProveedor(Integer id){

			 try {
				  Session session=sf.openSession();
	              session.beginTransaction();
	              Entity_FacturaProveedor p = (Entity_FacturaProveedor) session.get(Entity_FacturaProveedor.class, id);
	              session.getTransaction().commit();
	              return p;
			  } catch (Exception e) {
	              System.out.println(e);
	              System.out.println("Error ProveedorDAO. Get Factura Proveedor");
			  }
	      
			  return null;
		}
	 
		public void altaServicioSeguridad(Entity_ServicioSeguridad servicio){
	        try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(servicio); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ProveedorDAO. Alta Servicio Seguridad");
	        }
		}
	 
		public void modificarServicioSeguridad(Entity_ServicioSeguridad servicio) {
			 try {
		        	Session session=sf.openSession();
		            session.beginTransaction();
		            session.update(servicio); 
		            session.getTransaction().commit();
		            session.close();
		        } catch (Exception e){
		            System.out.println(e);
		            System.out.println("Error ProveedorDAO. Modificar Servicio Seguridad");
		        }
		}
		public void bajaServicioSeguridad(Entity_ServicioSeguridad servicio) {
			try {
				 Session session=sf.getCurrentSession();
	            session.beginTransaction();
	            session.delete(servicio);
	            session.flush();
	            session.getTransaction().commit();
	       } catch (Exception e){
	           System.out.println(e);
	           System.out.println("Error ProveedorDAO. Eliminar Servicio Seguridad");
	       }
		}

		public Entity_ServicioSeguridad getServicioSeguridad(Integer id){

			 try {
				  Session session=sf.openSession();
	              session.beginTransaction();
	              Entity_ServicioSeguridad p = (Entity_ServicioSeguridad) session.get(Entity_ServicioSeguridad.class, id);
	              session.getTransaction().commit();
	              return p;
			  } catch (Exception e) {
	              System.out.println(e);
	              System.out.println("Error ProveedorDAO. Get Servicio Seguridad");
			  }
	      
			  return null;
		}
	 
		public void altaSeguro(Entity_Seguro seguro){
	        try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(seguro); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ProveedorDAO. Alta seguro");
	        }
		}
		public void modificarSeguro(Entity_Seguro seguro) {
			 try {
		        	Session session=sf.openSession();
		            session.beginTransaction();
		            session.update(seguro); 
		            session.getTransaction().commit();
		            session.close();
		        } catch (Exception e){
		            System.out.println(e);
		            System.out.println("Error ProveedorDAO. Modificar Seguro");
		        }
		}
		public void bajaSeguro(Entity_Seguro seguro) {
			try {
				 Session session=sf.getCurrentSession();
	            session.beginTransaction();
	            session.delete(seguro);
	            session.flush();
	            session.getTransaction().commit();
	       } catch (Exception e){
	           System.out.println(e);
	           System.out.println("Error ProveedorDAO. Eliminar Seguro");
	       }
		}

		public Entity_Seguro getSeguro(Integer id){

			 try {
				  Session session=sf.openSession();
	              session.beginTransaction();
	              Entity_Seguro s = (Entity_Seguro) session.get(Entity_Seguro.class, id);
	              session.getTransaction().commit();
	              return s;
			  } catch (Exception e) {
	              System.out.println(e);
	              System.out.println("Error ProveedorDAO. Get Seguro");
			  }
	      
			  return null;
		}
	 
		public void altaPrecioCarrier(Entity_PrecioCarrier precioCarrier){
	        try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(precioCarrier); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ProveedorDAO. Alta Precio Carrier");
	        }
		}
		public void modificarPrecioCarrier(Entity_PrecioCarrier precioCarrier) {
			 try {
		        	Session session=sf.openSession();
		            session.beginTransaction();
		            session.update(precioCarrier); 
		            session.getTransaction().commit();
		            session.close();
		        } catch (Exception e){
		            System.out.println(e);
		            System.out.println("Error ProveedorDAO. Modificar Precio Carrier");
		        }
		}
		public void bajaPrecioCarrier(Entity_PrecioCarrier precioCarrier) {
			try {
				 Session session=sf.getCurrentSession();
	            session.beginTransaction();
	            session.delete(precioCarrier);
	            session.flush();
	            session.getTransaction().commit();
	       } catch (Exception e){
	           System.out.println(e);
	           System.out.println("Error ProveedorDAO. Eliminar Precio Carrier");
	       }
		}

		public Entity_PrecioCarrier getPrecioCarrier(Integer id){

			 try {
				  Session session=sf.openSession();
	              session.beginTransaction();
	              Entity_PrecioCarrier pc = (Entity_PrecioCarrier) session.get(Entity_PrecioCarrier.class, id);
	              session.getTransaction().commit();
	              return pc;
			  } catch (Exception e) {
	              System.out.println(e);
	              System.out.println("Error ProveedorDAO. Get Precio Carrier");
			  }
	      
			  return null;
		}
	 
		@SuppressWarnings("unchecked")
	    public List<Entity_Proveedor> listarProveedores() {           
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Proveedor> lista = session.createQuery("from Entity_Proveedor").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	             
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Proveedor");
	            }
	            
	            return null;	
	    }
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_Proveedor> listarTalleres() {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Proveedor> lista = session.createQuery("select f from Entity_Proveedor p  where p.tipo= :tipo").setParameter("tipo", "T").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Talleres");
	            }
	            
	            return null;	
	    }  
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_Proveedor> listarAseguradoras() {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Proveedor> lista = session.createQuery("select f from Entity_Proveedor p  where p.tipo= :tipo").setParameter("tipo", "A").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Aseguradoras");
	            }
	            
	            return null;	
	    }  
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_Proveedor> listarEmpresasSeguridad() {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Proveedor> lista = session.createQuery("select f from Entity_Proveedor p  where p.tipo= :tipo").setParameter("tipo", "S").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Empresas Seguridad");
	            }
	            
	            return null;	
	    } 
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_Proveedor> listarCarriers() {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Proveedor> lista = session.createQuery("select f from Entity_Proveedor p  where p.tipo= :tipo").setParameter("tipo", "C").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Carriers");
	            }
	            
	            return null;	
	    } 
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_FacturaProveedor> listarFacturasProveedorPendientes() {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_FacturaProveedor> lista = session.createQuery("select f from Entity_Proveedor  p join p.facturas f   where f.montoPendiente> 0").list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Facturas Proveedor pendientes");
	            }
	            
	            return null;	
	    }  
	 
		@SuppressWarnings("unchecked")
	    public List<Entity_FacturaProveedor> listarFacturasProveedor(Integer id) {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_FacturaProveedor> lista = session.createQuery("select f from Entity_Proveedor p join p.facturas f where p.idProveedor= :id").setParameter("id", id).list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Facturas Proveedor");
	            }
	            
	            return null;	
	    }  
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_FacturaProveedor> listarFacturasProveedorPendientes(Integer idProveedor) {
	         
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_FacturaProveedor> lista = session.createQuery("select f from Entity_Proveedor p join p.facturas f where p.idProveedor= :id and f.montoPendiente>0").setParameter("id", idProveedor).list();
		                session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Facturas Proveedor pendientes");
	            }
	            
	            return null;	
	    }  
	    
	    @SuppressWarnings("unchecked")
	    public List<Entity_ServicioSeguridad> listarServicioSeguridad(Integer id) {
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_ServicioSeguridad> lista = session.createQuery("select s from Entity_Proveedor p join p.servicios s where p.idProveedor= :id").setParameter("id", id).list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	                    
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Carrier Proveedor");
	            }
	            
	            return null;		
		
	    } 
	 
	    @SuppressWarnings("unchecked")
	    public List<Entity_Seguro> listarSeguros(Integer id) {            
	            try {
	            		Session session=sf.openSession();
	                    session.beginTransaction();
	                    List<Entity_Seguro> lista = session.createQuery("select s from Entity_Proveedor p join p.seguros s where p.idProveedor= :id").setParameter("id", id).list();
	                    session.flush();
	                    session.getTransaction().commit();
	                    return lista;
	            } catch (Exception e) {
	                    System.out.println(e);
	                    System.out.println("Error ProveedorDAO. Listar Seguros Proveedor");
	            }
	            
	            return null;	
		
	    }  
	    
	@SuppressWarnings("unchecked")
    public List<Entity_PrecioCarrier> listarPrecioCarrier(Integer id) {

            try {
            		Session session=sf.openSession();
                    session.beginTransaction();
                    List<Entity_PrecioCarrier> lista = session.createQuery("select l from Entity_PrecioCarrier p where p.proveedor.id= :id").setParameter("id", id).list();
                    session.flush();
                    session.getTransaction().commit();
                    return lista;
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error ProveedorDAO. Listar Carrier Proveedor");
            }
            
            return null;		
	
    }  

    @SuppressWarnings("unchecked")
    public List<Entity_PrecioCarrier> listarPrecioCarrierDestino(Integer idDestino) {

            try {
            		Session session=sf.openSession();
                    session.beginTransaction();
                    List<Entity_PrecioCarrier> lista = session.createQuery("select l from Entity_PrecioCarrier p where p.destino.id= :id").setParameter("id", idDestino).list();
                    session.flush();
                    session.getTransaction().commit();
                    return lista;
            } catch (Exception e) {
                    System.out.println(e);
                    System.out.println("Error ProveedorDAO. Listar Carrier Proveedor Destino");
            }
            
            return null;		
	
    }  

}
